package db

import (
	"GinTemplate/conf"
	"GinTemplate/utils/log"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 全局mysql数据库变量
var DB *gorm.DB

// 初始化mysql数据库
func InitMysql() {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&collation=%s&%s",
		conf.Cfg.Mysql.Username,
		conf.Cfg.Mysql.Password,
		conf.Cfg.Mysql.Host,
		conf.Cfg.Mysql.Port,
		conf.Cfg.Mysql.Database,
		conf.Cfg.Mysql.Charset,
		conf.Cfg.Mysql.Collation,
		conf.Cfg.Mysql.Query,
	)
	//隐藏密码
	showDsn := fmt.Sprintf("%s:*********@tcp(%s:%d)/%s?charset=%s&collation=%s&%s",
		conf.Cfg.Mysql.Username,
		conf.Cfg.Mysql.Host,
		conf.Cfg.Mysql.Port,
		conf.Cfg.Mysql.Database,
		conf.Cfg.Mysql.Charset,
		conf.Cfg.Mysql.Collation,
		conf.Cfg.Mysql.Query,
	)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		// 禁用外键(指定外键时不会在mysql创建真实的外键约束)
		DisableForeignKeyConstraintWhenMigrating: true,
		//// 指定表前缀
		//NamingStrategy: schema.NamingStrategy{
		//	TablePrefix: config.Conf.Mysql.TablePrefix + "_",
		//},
	})
	if err != nil {
		log.Errorf("初始化MySQL数据库异常:%v", err)
		panic(fmt.Errorf("初始化mysql数据库异常: %v", err))
	}

	// 开启mysql日志
	if conf.Cfg.Mysql.LogMode {
		db.Debug()
	}
	DB = db
	SqlDb, _ := DB.DB()
	SqlDb.SetMaxOpenConns(conf.Cfg.Mysql.MaxOpenConns)
	SqlDb.SetMaxIdleConns(conf.Cfg.Mysql.MaxIdleConns)

	//自动迁移数据表
	dbAutoMigrate()
	log.Info("初始化mysql数据库完成! dsn: %s", showDsn)
}

func dbAutoMigrate() {
	err := DB.AutoMigrate()
	if err != nil {
		log.Errorf("迁移表结构失败:%v", err)
	}
}
